/**
 * BigInt 序列化工具函数
 * 解决 JSON.stringify 无法序列化 BigInt 的问题
 */

/**
 * 将对象中的 BigInt 转换为字符串
 * @param obj 要转换的对象
 * @returns 转换后的对象
 */
export function serializeBigInt<T>(obj: T): T {
  if (obj === null || obj === undefined) {
    return obj;
  }

  if (typeof obj === 'bigint') {
    return String(obj) as T;
  }

  // 处理Date对象，转换为ISO字符串
  if (obj instanceof Date) {
    return obj.toISOString() as T;
  }

  if (Array.isArray(obj)) {
    return obj.map(item => serializeBigInt(item)) as T;
  }

  if (typeof obj === 'object') {
    const result: any = {};
    for (const [key, value] of Object.entries(obj)) {
      result[key] = serializeBigInt(value);
    }
    return result;
  }

  return obj;
}

/**
 * 将字符串转换回 BigInt（如果适用）
 * @param obj 要转换的对象
 * @returns 转换后的对象
 */
export function deserializeBigInt<T>(obj: T): T {
  if (obj === null || obj === undefined) {
    return obj;
  }

  if (typeof obj === 'string' && /^\d+$/.test(obj)) {
    try {
      return BigInt(obj) as T;
    } catch {
      return obj;
    }
  }

  if (Array.isArray(obj)) {
    return obj.map(item => deserializeBigInt(item)) as T;
  }

  if (typeof obj === 'object') {
    const result: any = {};
    for (const [key, value] of Object.entries(obj)) {
      result[key] = deserializeBigInt(value);
    }
    return result;
  }

  return obj;
}

/**
 * 自定义 JSON.stringify 替换函数
 * @param key 键名
 * @param value 值
 * @returns 处理后的值
 */
export function bigIntReplacer(key: string, value: any): any {
  if (typeof value === 'bigint') {
    return value.toString();
  }
  return value;
}

/**
 * 自定义 JSON.parse 恢复函数
 * @param key 键名
 * @param value 值
 * @returns 处理后的值
 */
export function bigIntReviver(key: string, value: any): any {
  if (typeof value === 'string' && /^\d+$/.test(value) && key === 'id') {
    try {
      return BigInt(value);
    } catch {
      return value;
    }
  }
  return value;
}

/**
 * 安全的 JSON 字符串化，支持 BigInt
 * @param obj 要序列化的对象
 * @param space 缩进空格数
 * @returns JSON 字符串
 */
export function safeStringify(obj: any, space?: number): string {
  return JSON.stringify(obj, bigIntReplacer, space);
}

/**
 * 安全的 JSON 解析，支持 BigInt
 * @param str JSON 字符串
 * @returns 解析后的对象
 */
export function safeParse(str: string): any {
  return JSON.parse(str, bigIntReviver);
}
